草庐IT

c++ - RAII 和 C++ STL

全部标签

c++ - STL优先级队列和指针重载

这是我第一次使用优先队列。我正在尝试为学校实现Dijkstra算法,我认为我需要一个最小堆来执行此操作。现在我的节点是指针,我想比较它们的权重,但我认为我不能用指针重载>和到目前为止的代码:priority_queue,node_comparison>minHeap;然后我有一个结构来比较节点的权重structnode_comparison{booloperatortotalWeighttotalWeight;}};但是它说这个运算符函数的参数太多了。一段时间以来,我一直在尝试弄清楚如何用我的节点管理一个最小堆优先级队列,但一直卡住。有什么想法吗? 最佳答案

c++ - 如何强制清除 STL 内存缓存?

我有一个类,它有一个unordered_map类型的字段。我在我的应用程序中创建了该对象的单个实例,它被包装在shared_ptr中。该对象非常耗费内存,我想在使用完后立即将其删除。然而,重置指针只是释放了对象占用的一小部分内存。如何强制程序释放对象占用的所有内存?以下模拟程序重现了我的问题。for循环打印垃圾只是为了让我有足够的时间观察top使用的内存。析构函数在reset()之后被调用。此外,紧接着,使用的内存从大约2GB下降到1.5GB。#include#include#includeusingnamespacestd;structA{~A(){cerrindex;};intma

c++ - 是否已经实现了任何 RAII 文件句柄?

RAII文件句柄看起来很基础,所以我猜它已经实现了?但是我找不到任何实现。我在boost::iostreams中找到了file_descriptor,但我不知道它是否是我要找的。 最佳答案 std::fstream支持RAII风格的用法-它们可以在构建时打开甚至测试,它们会在析构函数中自动刷新和关闭,但如果你可能会错过错误只是假设它有效,所以如果您需要稳健性,您可能想在代码中做一些更明确的事情。例如:if(std::ifstreaminput(filename))...useinput...elsestd::cerr如果你真的想使用

C++ 简洁地检查 STL 容器中的项目(例如 vector )

boolxInItems=std::find(items.begin(),items.end(),x)!=items.end();是否有更简洁的方法来检查x是否在项目中?这似乎不必要地冗长(重复项目三次),这使得代码的意图有点难以阅读。比如有没有类似下面的东西:boolxInItems=boost::contains(items,x);如果不存在任何更简洁的boost/STL算法来检查集合是否包含项目,那么使用辅助函数来启用contains(items,x)?我是否使用了错误的STL容器?即使是std::set也会导致boolxInItems=items.find(x)!=items.

c++ - C++ 中的 goto 和 RAII

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Gotooutofablock:dodestructorsgetcalled?我知道C和C++中的goto运算符几乎在所有情况下都是无用的,但我想知道这个问题的答案只是出于兴趣,它没有实际意义。C++标准是否保证在这种情况下必须正确调用对象的析构函数?#includeclassFoo{public:Foo(){std::couthttp://liveworkspace.org/code/06031e6699c8fddda94b8594ccab1387那么goto和C++RAII的其他异常情况呢?如果您能在这里

c++ - std::map::begin() 之前的 STL 迭代器

在C++11的std::map中,是否有一些有效的迭代器x使得++x保证等于map::开始()?我想检测我刚刚调用的函数(我的)是否已经将迭代器从函数的前面移开。该函数会将迭代器恰好向后移动一个位置。答案是否适用于图书馆的其他人? 最佳答案 不,std容器中开始之前的迭代器都是UB(反向迭代器除外,它可能无法解决您的问题)。您可能需要修复有问题的函数。如果做不到这一点,请将其包装起来并在调用它之前捕获不良行为。如果做不到这一点,您可以在map键类型排序中插入一个负无穷大元素,并添加一个标记值。如果做不到这一点,您可以编写迭代器适配器

c++ - 为什么我应该在 c++ 而不是 c 中设置插件接口(interface)

由于我的previousquestions我问自己:为插件系统设置C++接口(interface)是否有用?以下几点反对它:不同编译器及其版本之间没有共同的ABI,内存中的对象没有共同的布局没有直接类导出。您必须导出工厂和析构函数。如果你的对象被其他对象持有,问题就会出现delete它们,例如智能指针。STL的不同实现,你不能传递std::list到插件使用不同版本的库,例如Boost如果您将自己限制在C++语言的其余部分,您几乎会以“C子集”告终。使用C++有什么要点吗?Qt-Toolkit是如何解决上述问题的?备注:我主要指的是Linux系统。不过,我对其他平台上的解决方案很感兴趣

c++ - 您是否必须在类似 STL 的类中实现多个迭代器?

我非常熟悉STL及其使用方法。我的问题是...如果我要实现自己的STL容器类型,如何定义内部迭代器?STL类往往具有顺序或随机访问迭代器、它们的const_版本和流迭代器。这些迭代器是否在每个STL类中都已完全定义,或者是否存在您从中继承的某种基类以获得大部分迭代器功能?有谁知道有关如何实现支持这些不同类型的迭代器的类的良好引用? 最佳答案 一般来说,你只需要实现iterator和const_iterator.如果需要反向迭代器,可以使用std::reverse_iterator的实例化.流迭代器将使用operator>>和oper

c++ - STL 中的比较器

我正在使用structminHeap生成一个使用priority_queue的最小堆。并且函数comp使用STL中给出的排序函数以相反的顺序打印数字。现在我的疑问是我不能在函数sort中使用structminHeap并且不能在priorityQueue中使用函数comp。感觉structminHeap和comp的功能差不多。请解释一下何时使用比较器的结构以及何时使用普通函数作为STL中的比较器?#include#include#include#includeusingnamespacestd;structminHeap{booloperator()(constinta,constint

c++ - 切换到C++11时,是否需要重新编译接口(interface)中使用STL的所有依赖库?

我正在尝试将一个大型项目切换为使用C++11。我遇到了大量链接器错误,这些错误似乎是由使用C++11编译的库和使用C++03编译的库之间的STL类上不匹配的命名空间引起的。例如,假设库B是A的依赖项。B具有以下模板化类作为其接口(interface)的一部分。templateclassVectorParameter{public:VectorParameter();virtual~VectorParameter();...}库A使用VectorParameter>实例化模板.当我用C++11重新编译A而没有重新编译B时,我遇到了链接器错误并提示LFE::VectorParameter>